import re

from django_redis import get_redis_connection
from rest_framework import serializers
from rest_framework_jwt.settings import api_settings

from users.models import User


class CreateUserSerializer(serializers.ModelSerializer):
    """用户注册
    传入参数：
        username, password, password2, sms_code, mobile, allow
        最后需要将id,mobile,username传给前端
    校验参数
    创建模型类对象"""

    password2 = serializers.CharField(label='确认密码', write_only=True)
    sms_code = serializers.CharField(label='短信验证码',write_only=True)
    allow = serializers.CharField(label='同意协议', write_only=True)
    token = serializers.CharField(label='登录状态token', read_only=True)  # 增加token字段

    class Meta:
        model = User
        fields = ('id', 'username', 'password', 'password2', 'sms_code', 'mobile', 'allow', 'token')
        extra_kwargs = {
            'username': {
                'min_length': 5,
                'max_length': 20,
                'error_messages': {
                    'min_length': '仅允许5-20个字符的用户名',
                    'max_length': '仅允许5-20个字符的用户名',
                }
            },
            'password': {
                'write_only': True,
                'min_length': 8,
                'max_length': 20,
                'error_messages': {
                    'min_length': '仅允许8-20个字符的密码',
                    'max_length': '仅允许8-20个字符的密码',
                }
            }
        }

    def validate(self, data):
        password = data['password']
        password2 = data['password2']
        allow = data['allow']
        sms_code = data['sms_code']
        mobile = data['mobile']
        print(sms_code,mobile)
        if not re.match(r'^1[3-9]\d{9}$', mobile):
            raise serializers.ValidationError('手机号格式错误')
        if allow != 'true':
            raise serializers.ValidationError('请同意用户协议')
        if password != password2:
            raise serializers.ValidationError('两次密码不一致')

        redis_conn = get_redis_connection('verify_codes')
        new_sms_code = redis_conn.get('msm_' + mobile)
        if not new_sms_code:
            raise serializers.ValidationError('验证码失效')
        if new_sms_code.decode() != sms_code:
            raise serializers.ValidationError('手机验证码错误')
        return data

    def create(self, validated_data):
        """
              创建用户
              """

        # 移除数据库模型类中不存在的属性
        del validated_data['password2']
        del validated_data['sms_code']
        del validated_data['allow']

        s = super(CreateUserSerializer, self).create(validated_data)
        s.set_password(validated_data['password'])
        s.save()


        jwt_p_h = api_settings.JWT_PAYLOAD_HANDLER
        jwt_e_h = api_settings.JWT_ENCODE_HANDLER
        payload = jwt_p_h(s)
        token = jwt_e_h(payload)
        s.token = token

        return s


# class CreateUserSerializer(serializers.ModelSerializer):
#     """
#     创建用户序列化器
#     """
#     password2 = serializers.CharField(label='确认密码', write_only=True)
#     sms_code = serializers.CharField(label='短信验证码', write_only=True)
#     allow = serializers.CharField(label='同意协议', write_only=True)
#
#     class Meta:
#         model = User
#         fields = ('id', 'username', 'password', 'password2', 'sms_code', 'mobile', 'allow')
#         extra_kwargs = {
#             'username': {
#                 'min_length': 5,
#                 'max_length': 20,
#                 'error_messages': {
#                     'min_length': '仅允许5-20个字符的用户名',
#                     'max_length': '仅允许5-20个字符的用户名',
#                 }
#             },
#             'password': {
#                 'write_only': True,
#                 'min_length': 8,
#                 'max_length': 20,
#                 'error_messages': {
#                     'min_length': '仅允许8-20个字符的密码',
#                     'max_length': '仅允许8-20个字符的密码',
#                 }
#             }
#         }
#
#     def validate_mobile(self, value):
#         """验证手机号"""
#         if not re.match(r'^1[3-9]\d{9}$', value):
#             raise serializers.ValidationError('手机号格式错误')
#         return value
#
#     def validate_allow(self, value):
#         """检验用户是否同意协议"""
#         if value != 'true':
#             raise serializers.ValidationError('请同意用户协议')
#         return value
#
#     def validate(self, data):
#         # 判断两次密码
#         print("*-*-*-*-*-*-*-*-*-")
#         if data['password'] != data['password2']:
#             raise serializers.ValidationError('两次密码不一致')
#
#         # 判断短信验证码
#         redis_conn = get_redis_connection('verify_codes')
#         mobile = data['mobile']
#         print(mobile,type(mobile))
#         real_sms_code = redis_conn.get(str('msm_' + mobile))
#         print(real_sms_code)
#         if real_sms_code is None:
#             raise serializers.ValidationError('无效的短信验证码')
#         if data['sms_code'] != real_sms_code.decode():
#             raise serializers.ValidationError('短信验证码错误')
#         print("123123")
#         return data
#
#     def create(self, validated_data):
#         """
#         创建用户
#         """
#         # 移除数据库模型类中不存在的属性
#         print("*-*-*"*10)
#         del validated_data['password2']
#         del validated_data['sms_code']
#         del validated_data['allow']
#         user = super().create(validated_data)
#
#         # 调用django的认证系统加密密码
#         user.set_password(validated_data['password'])
#         user.save()
#
#         return user